﻿Public Class ListaDobleConOrden
    Public inicio As NodoDoble
    Public fin As NodoDoble
    ' constructor
    Public Sub New()
        inicio = Nothing
        fin = Nothing
    End Sub

    ' get/set
    Public Sub setInicio(ByVal inicio As NodoDoble)
        Me.inicio = inicio

    End Sub

    Public Sub setFin(ByVal fin As NodoDoble)
        Me.fin = fin

    End Sub

    Public Function getInicio() As NodoDoble
        Return Me.inicio

    End Function

    Public Function getFin() As NodoDoble
        Return Me.fin

    End Function
    Public Sub agrega(ByVal direccion As Direcciones)
        Dim nuevo, auxiliar As NodoDoble
        '...preparar nuevo nodo ...
        nuevo = New NodoDoble(direccion)
        nuevo.setApuntSgte(Nothing)
        nuevo.setApuntAnt(Nothing)
        '...adicionar nuevo nodo a la lista...
        If IsNothing(Me.inicio) Then
            Console.WriteLine("Pase inicio")
            'primer nodo
            Me.inicio = nuevo
            Me.fin = inicio

        ElseIf direccion.getNombre().CompareTo(inicio.getNodo().getNombre()) < 0 Then
            'antes del primer nodo
            nuevo.setApuntSgte(inicio)
            inicio.setApuntAnt(nuevo)
            inicio = nuevo

        ElseIf direccion.getNombre().CompareTo(fin.getNodo().getNombre()) > 0 OrElse direccion.getNombre().CompareTo(fin.getNodo().getNombre()) = 0 Then
            'despues del ultimo nodo
            nuevo.setApuntAnt(fin)
            fin.setApuntSgte(nuevo)
            fin = nuevo

        Else
            'entre dos nodos ya existentes
            auxiliar = inicio
            ' ubica el anterior
            While direccion.getNombre().CompareTo(auxiliar.getNodo().getNombre()) > 0 OrElse direccion.getNombre().CompareTo(auxiliar.getNodo().getNombre()) = 0
                auxiliar = auxiliar.getApuntSgte()

            End While

            ' enlaza
            nuevo.setApuntSgte(auxiliar)
            nuevo.setApuntAnt(auxiliar.getApuntAnt())
            auxiliar.getApuntAnt().setApuntSgte(nuevo)
            auxiliar.setApuntAnt(nuevo)

        End If

    End Sub
    '.....busca un codigo en la lista
    Public Function busca(ByVal codigo As String) As NodoDoble
        ' empieza por el primero de la lista
        Dim Auxiliar As NodoDoble = inicio
        ' mientras no sea nulo
        While Auxiliar IsNot Nothing
            If codigo.Equals(Auxiliar.getNodo().getNombre()) Then
                Return Auxiliar

            Else
                Auxiliar = Auxiliar.getApuntSgte() ' pasa al siguiente

            End If

        End While
        ' fin del while
        ' termina la lista y no lo encontro
        Return Nothing

    End Function

    Public Sub elimina(ByVal aux As NodoDoble)
        If inicio.Equals(fin) AndAlso aux.Equals(inicio) Then

            setInicio(Nothing) 'Si es el uniko

        ElseIf aux.Equals(inicio) Then

            inicio = aux.getApuntSgte() 'El primer nodo
            inicio.setApuntAnt(Nothing)

        ElseIf aux.getApuntAnt() IsNot Nothing AndAlso aux.getApuntSgte() IsNot Nothing Then

            aux.getApuntAnt().setApuntSgte(aux.getApuntSgte()) 'Eliminar el nodo del medio
            aux.getApuntSgte().setApuntAnt(aux.getApuntAnt())

        ElseIf aux.Equals(fin) Then

            aux.getApuntAnt().setApuntSgte(Nothing) 'Si es el ultimo
            setFin(aux.getApuntAnt())

        End If

    End Sub

End Class